import router from "./index"; // 路由
import store from "../store"; // 仓库
import { Message } from "element-ui"; // 引入element信息提示模块
import NProgress from "nprogress"; // 引入加载进度条组件
import "nprogress/nprogress.css"; // 引入加载进度条组件样式
import { getToken } from "@/utils/auth"; // 引入获取token令牌方法
import getPageTitle from "@/utils/get-page-title"; // 引入浏览器标签标题文件

NProgress.configure({ showSpinner: false }); // 默认关闭加载进度条

const whiteList = ["/login"]; // 没有登录时可以访问的路径白名单

// 进入路由前的路由守卫
router.beforeEach(async (to, from, next) => {
  NProgress.start(); // 进入路由，跳转时开启上方的加载进度条
  document.title = getPageTitle(to.meta.title); // 设置浏览器标签页标题
  const hasToken = getToken(); // 获取登录令牌TokenKey
  // 检测用户是否登录
  if (hasToken) {
    // 利用令牌获取用户信息
    if (to.path === "/login") {
      // 已经登录的情况下直接跳转到首页，进入首页页面
      next({ path: "/" });
      NProgress.done(); // 路由跳转结束，加载进度条关闭
    } else {
      // 获取用户信息（第一次登录需要获取用户信息）
      const hasRoles = store.getters.name && store.getters.avatar;
      if (hasRoles) {
        next(); // 有用户信息直接跳转
      } else {
        // 没用户信息走这
        try {
          // 尝试获取用户信息
          await store.dispatch("admin/checkRole"); // 触发当前用户的用户信息请求（权限路由表+用户信息）
          const menus = store.getters.menus; // 获取过滤之后的路由表
          router.addRoutes(menus); // 动态添加可访问的路由
          // hack方法，以确保addRoutes是完整的，设置replace：true，因此导航不会留下历史记录
          next({ ...to, replace: true });
        } catch (error) {
          await store.dispatch("admin/resetToken"); // 删除登录令牌
          await store.dispatch("tagsView/delAllViews"); // 清空tab
          sessionStorage.clear(); // 删除所有sessionStorage缓存
          localStorage.clear(); // 删除所有localStorage缓存
          Message.error(error || "Has Error"); // 显示错误信息
          next(`/login?redirect=${to.path}`); // 重定向跳转到登录页面（重定向当前页）
          // next(`/login?redirect=dashboard`); // 重定向跳转到登录页面（重定向首页）
          NProgress.done(); // 路由跳转结束，加载进度条关闭
        }
      }
    }
  } else {
    // 没有登录，没有登录令牌
    if (whiteList.indexOf(to.path) !== -1) {
      // 判断即将要到达的路径是否在白名单
      // console.log("没有登录，路径在白名单里面，直接跳转，无需登录");
      next();
    } else {
      // 其他无权访问的页面将重定向到登录页面。
      // console.log("没有登录，路径不在白名单，返回登录页面");
      next(`/login?redirect=${to.path}`);
      // next(`/login?redirect=dashboard`);
      NProgress.done(); // 路由跳转结束，加载进度条关闭
    }
  }
});

// 进入路由后的路由守卫
router.afterEach(() => {
  // 路由跳转结束，加载进度条关闭
  NProgress.done();
});
